package com.chenxin.interact.handler.rcsHandler;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.chenxin.common.constant.WcsConstants;
import com.chenxin.common.core.domain.ProcResult;
import com.chenxin.common.utils.StringUtils;
import com.chenxin.interact.domain.dto.RcsCallbackDTO;
import com.chenxin.wms.domain.AgvTaskEntity;
import com.chenxin.wms.mapper.AgvTaskMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component("agvCallbackHandler")
public class AgvCallbackHandler {
    @Autowired
    private AgvTaskMapper agvTaskMapper;

    ProcResult call(RcsCallbackDTO dto) {
        if (dto == null || StringUtils.isNull(dto.getTaskCode())) {
            return ProcResult.error("agv_callback_001", "请求参数不能为空");
        }
        // 1. 获取任务编号
        String taskCode = dto.getTaskCode();
        String reqCode = dto.getReqCode();
        // 2. 获取任务
        QueryWrapper<AgvTaskEntity> qw = new QueryWrapper<>();
        qw.lambda().eq(AgvTaskEntity::getTaskCode, taskCode)
                .last("limit 1");
        AgvTaskEntity agvTask = agvTaskMapper.selectOne(qw);
        if (agvTask == null) {
            return ProcResult.error("agv_callback_002", "任务单【" + taskCode + "】不存在");
        }
        // 根据不同的method调用不同的业务逻辑
        String method = dto.getMethod();
        switch (method) {
            case WcsConstants.HK_METHOD_START:
                // 搬运任务启动
                agvTask.setAgvStatus(WcsConstants.HK_STATUS_START);
                agvTask.setData("任务单【" + taskCode + "】收到【start】通知，小车【" + dto.getRobotCode() + "】开始搬运");
                break;
            case WcsConstants.HK_METHOD_OUTBIN:
                // 载具出仓
                agvTask.setAgvStatus(WcsConstants.HK_STATUS_TAKE);
                agvTask.setData("任务单【" + taskCode + "】收到【outbin】通知，小车【" + dto.getRobotCode() + "】在站点【" + dto.getCurrentPositionCode() + "】走出储位");
                break;
            case WcsConstants.HK_METHOD_END:
                agvTask.setAgvStatus(WcsConstants.HK_STATUS_END);
                agvTask.setData("任务单【" + taskCode + "】收到【end】通知，小车【" + dto.getRobotCode() + "】在站点【" + dto.getCurrentPositionCode() + "】完成搬运");
        }
        agvTask.setUpdater(WcsConstants.WCS_USER_ID);
        agvTask.setUpdateDate(new Date());
        // 更新对应任务单的搬运任务
        agvTaskMapper.updateById(agvTask);
        // TODO 针对已完成任务进行数据转移处理
        return ProcResult.success("接收任务执行通知并处理完成");
    }
}
